package com.kds.smarthome.service;

import com.kds.smarthome.entity.EnergyStatistics;
import com.kds.smarthome.mapper.EnergyStatisticsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class EnergyStatisticsService {

    @Autowired
    private EnergyStatisticsMapper energyStatisticsMapper;
    
    @Autowired
    private BuildingService buildingService;

    /**
     * 获取所有能源统计项目
     */
    public List<EnergyStatistics> findAll() {
        return energyStatisticsMapper.findAll();
    }

    /**
     * 根据ID获取能源统计项目
     */
    public EnergyStatistics findById(Long tid) {
        return energyStatisticsMapper.findById(tid);
    }

    /**
     * 根据建筑编码获取能源统计项目列表
     */
    public List<EnergyStatistics> findByBuildingCode(String buildingCode) {
        return energyStatisticsMapper.findByBuildingCode(buildingCode);
    }

    /**
     * 根据建筑编码和统计项目编码获取能源统计项目
     */
    public EnergyStatistics findByBuildingCodeAndItemCode(String buildingCode, String statisticsItemCode) {
        return energyStatisticsMapper.findByBuildingCodeAndItemCode(buildingCode, statisticsItemCode);
    }

    /**
     * 创建能源统计项目
     */
    public void createEnergyStatistics(EnergyStatistics energyStatistics) {
        // 验证建筑是否存在
        if (buildingService.findByCode(energyStatistics.getBuildingCode()) == null) {
            throw new RuntimeException("建筑不存在");
        }
        
        // 验证统计项编码是否已存在
        EnergyStatistics existing = energyStatisticsMapper.findByBuildingCodeAndItemCode(
                energyStatistics.getBuildingCode(), energyStatistics.getStatisticsItemCode());
        if (existing != null) {
            throw new RuntimeException("该建筑下已存在相同编码的统计项目");
        }
        
        energyStatisticsMapper.insert(energyStatistics);
    }

    /**
     * 更新能源统计项目
     */
    public void updateEnergyStatistics(EnergyStatistics energyStatistics) {
        // 验证建筑是否存在
        if (buildingService.findByCode(energyStatistics.getBuildingCode()) == null) {
            throw new RuntimeException("建筑不存在");
        }
        
        // 验证是否存在
        EnergyStatistics existing = energyStatisticsMapper.findById(energyStatistics.getTid());
        if (existing == null) {
            throw new RuntimeException("统计项目不存在");
        }
        
        // 如果修改了编码，需要验证新编码是否已存在
        if (!existing.getStatisticsItemCode().equals(energyStatistics.getStatisticsItemCode())) {
            EnergyStatistics sameCode = energyStatisticsMapper.findByBuildingCodeAndItemCode(
                    energyStatistics.getBuildingCode(), energyStatistics.getStatisticsItemCode());
            if (sameCode != null) {
                throw new RuntimeException("该建筑下已存在相同编码的统计项目");
            }
        }
        
        energyStatisticsMapper.update(energyStatistics);
    }

    /**
     * 删除能源统计项目
     */
    public void deleteEnergyStatistics(Long tid) {
        // 验证是否存在
        if (energyStatisticsMapper.findById(tid) == null) {
            throw new RuntimeException("统计项目不存在");
        }
        
        energyStatisticsMapper.delete(tid);
    }

    /**
     * 删除建筑下所有能源统计项目
     */
    public void deleteByBuildingCode(String buildingCode) {
        energyStatisticsMapper.deleteByBuildingCode(buildingCode);
    }

    /**
     * 删除建筑下指定编码的能源统计项目
     */
    public void deleteByBuildingCodeAndItemCode(String buildingCode, String statisticsItemCode) {
        energyStatisticsMapper.deleteByBuildingCodeAndItemCode(buildingCode, statisticsItemCode);
    }
} 